﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PSE.ProcessManager.Server.Process.Security
{
    /// <summary>
    /// Classe que representa o contexto de autenticação
    /// </summary>
    /// <typeparam name="TData">Tipo do objeto que armazena os dados do contexto de autenticação</typeparam>
    public class AuthenticationContext<TData> where TData : class
    {
        private static object _syncRoot = new object();
        private static AuthenticationContext<TData> _authenticationContext;

        private static AuthenticationContext<TData> GetCurrent()
        {
            return _authenticationContext;
        }

        private static void SetCurrent(AuthenticationContext<TData> context)
        {
            lock (_syncRoot)
            {
                _authenticationContext = context;
            }
        }

        /// <summary>
        /// Retorna o contexto de autorização corrente.
        /// </summary>
        public static AuthenticationContext<TData> Current
        {
            get
            {
                return GetCurrent();
            }
            set
            {
                SetCurrent(value);
            }
        }

        /// <summary>
        /// Armazena os dados do contexto de autorização
        /// </summary>
        public TData AuthenticationData
        {
            get;
            set;
        }

        /// <summary>
        /// Construtor
        /// </summary>
        /// <param name="data"></param>
        public AuthenticationContext(TData authenticationData)
        {
            this.AuthenticationData = authenticationData;
        }

        /// <summary>
        /// Construtor
        /// </summary>
        public AuthenticationContext()
        {
        }
    }
}
